package test.selenium;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.interactions.Locatable;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.testng.asserts.Assertion;

import java.util.List;
import java.util.concurrent.TimeUnit;

public class WebQqMail {

    public WebDriver driver;
//    String baseUrl = "https://mail.qq.com/";
    String baseUrl = "https://mail.qq.com/cgi-bin/loginpage";

    @Test
    public void testSendMail() {
        driver.get(baseUrl);

        //前进、后退、刷新 方法都在navigate。
//        driver.navigate().refresh();

        Assert.assertNotNull(driver.findElement(By.id("qqLoginTab")));
        driver.findElement(By.id("qqLoginTab")).click();

        //切换到账号登录。
        driver.switchTo().defaultContent().switchTo().frame("login_frame");

        //模拟输入用户名和密码。
        driver.findElement(By.id("u")).sendKeys("199526628");
        driver.findElement(By.id("resource")).sendKeys("zyhzyh121301");

        //触发登录。
        driver.findElement(By.id("login_button")).click();

        driver.switchTo().defaultContent();
        //通过chrome的xpath菜单得出路径 或 https://www.w3school.com.cn/xpath/xpath_syntax.asp 。
        WebElement useraliasWE = driver.findElement(By.xpath("//*[@id=\"useralias\"]"));
        Assert.assertNotNull(useraliasWE);

        //判断值
        Assert.assertEquals(useraliasWE.getText() , "hihi");

        //复杂动作。
        Actions writeLetterAction = new Actions(driver);
        writeLetterAction.click(driver.findElement(By.id("composebtn_td"))).perform();

        driver.switchTo().defaultContent().switchTo().frame("mainFrame");
        new WebDriverWait(driver , 20 , 100)
                .until(ExpectedConditions.attributeContains(
                        By.id("frm") , "action" , "/cgi-bin/compose_send")
                );

        //在可视范围看不到的元素，会找不到。
        //需要滚动页面。
        //https://blog.csdn.net/df0128/article/details/80192958
        //window.top.frames['mainFrame'].document.getElementById("quick_del")
//        String js =
//                "var clientHeight = window.top.frames['mainFrame'].document.body.clientHeight;" +
//                "window.top.frames['mainFrame'].window.scrollBy(0 , clientHeight);";
//        JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
//        jsExecutor.executeScript(js);
        WebElement sourceWE = driver.findElement(By.id("source"));
        Assert.assertNotNull(sourceWE);

    }

    /**
     * 对HTML SELECT ELEMENT的操作。
     */
    private void testSelect(){
        int index = 1;
        String text = "";
        String value = "";

        //根据select元素获取select对象
        Select select = new Select(driver.findElement(By.id("a")));
        //根据索引选择子选项，从1开始
        select.selectByIndex(index);
        //根据子选项的value属性的值来选择
        select.selectByValue(value);
        //根据子选项的text值来选择
        select.selectByVisibleText(text);

        //获取所有被选择的子选项的元素列表（多选）
        List<WebElement> selectedElements = select.getAllSelectedOptions();

        //获取第一个被选择的子选项（单选）
        WebElement element = select.getFirstSelectedOption();

        //获取所有子选项的元素列表
        List<WebElement> allOptions = select.getOptions();

        //去选择所有子选项（多选）
        select.deselectAll();
        //去选择子选项，根据索引，从1开始（多选）
        select.deselectByIndex(index);
        //去选择子选项，根据其value属性的值（多选）
        select.deselectByValue(value);
        //去选择子选项，根据其text值（多选）
        select.deselectByVisibleText(text);
    }

    @BeforeMethod
    public void beforeMethod() {
//        System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");

        ChromeOptions options = new ChromeOptions();

//        String proxyIpAndPort= "localhost:8080";//代理地址
//        Proxy proxy = new Proxy();
//        proxy.setAutodetect(true);//是否自动检测代理设置；
//        proxy.setFtpProxy(proxyIpAndPort);//ftp代理地址
//        proxy.setHttpProxy(proxyIpAndPort);//http代理地址
//        proxy.setNoProxy(proxyIpAndPort);//无需代理的网址列表，用;分隔
//        proxy.setProxyAutoconfigUrl(proxyAutoconfigUrl);//代理自动设置地址
//        proxy.setProxyType(ProxyType.MANUAL);//手工代理，必填
//        proxy.setSocksPassword(password);//密码
//        proxy.setSocksUsername(username);//用户名
//        proxy.setSocksVersion(5);//添加此项会自动设置proxyType为ProxyType.MANUAL，此项设置内容为socks的版本，为4或者5，最新为5
//        proxy.setSslProxy(proxyIpAndPort);
//        options.setProxy(proxy);

        options.addArguments("–first run");
        options.addArguments("–incognito");
        options.addArguments("--lang=zh_CN.UTF-8");
        //不启动浏览器测试。
//        options.addArguments("--headless");

        driver = new ChromeDriver(options);
        driver.manage().window().maximize();

        //此处为设定页面加载超时时间为20s
        driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS);
        //此处为设定元素查找最长超时时间为12s
        driver.manage().timeouts().implicitlyWait(12, TimeUnit.SECONDS);
        //此处为设置js脚本运行超时时间为13s
        driver.manage().timeouts().setScriptTimeout(13, TimeUnit.SECONDS);

        //如果要测试手机浏览器 https://www.cnblogs.com/superhin/p/11691855.html

    }

    @AfterMethod
    public void afterMethod() {
        driver.quit();
    }

}